package xiancheng.tongbu;

/**
 * 
 * @author Jin Jing
 * 
 * synchronized(同步)
 * 
 * 如果某个线程调用对象上的synchronized方法，首先就请求对该对象上锁
 * 
 * 尤其关键的是，当一个线程访问object的一个synchronized(this)同步代码块时，
 * 其他线程对object中所有其它synchronized(this)同步代码块的访问将被阻塞。
 * （注意不是仅对方法上锁！）
 * 
 * 构造函数不能声明为synchronized的
 * 
 * 当一个继承类覆盖同步方法时，新方法既可以是同步方法也可以不是。
 * 
 * 当非同步方法是用super调用其超类的方法时，对象就被锁定。
 * 
 * 静态方法也可以声明是同步的，锁定的只是其他静态同步方法，不影响该类任何对象
 * 
 * 同步语句，确保values为同步对象，该用途还可用于提供互斥锁
 *
 */
public class BankAccount {
	private long number;
	private long balance;
	
	public BankAccount() {
		synchronized (BankAccount.class) {
			//对类加锁也是可以的
		}
	}
	
	public BankAccount(long accountNumber, long initialDeposit) {
		setNumber(accountNumber);
		balance = initialDeposit;
	}
	
	public synchronized long getBalance() {
		return balance;
	}
	
	public synchronized void deposit(long amount) {
		balance += amount;
	}

	public void setNumber(long number) {
		this.number = number;
	}

	public long getNumber() {
		return number;
	}
	
	//同步语句，确保values为同步对象，该用途还可用于提供互斥锁
	public static void abs(int[] values) {
		synchronized (values) {
			for(int i = 0; i < values.length; i++) {
				if(values[i] < 0) {
					values[i]= - values[i]; 
				}
			}
		}
		
	}
	
}
